home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 1.2 KB | 48 lines | [TEXT/YHS2] |
- {-
- This module implements a sort function using a variation on
- quicksort. It is stable, uses no concatenation and compares
- only with <=.
-
- sortLe sorts with a given predicate
- sort uses the <= method
-
- Author: Lennart Augustsson
- -}
-
- module QSort(sortLe, sort) where
- sortLe :: (a -> a -> Bool) -> [a] -> [a]
- sortLe le l = qsort le l []
-
- sort :: (Ord a) => [a] -> [a]
- sort l = qsort (<=) l []
-
- -- qsort is stable and does not concatenate.
- qsort le [] r = r
- qsort le [x] r = x:r
- qsort le (x:xs) r = qpart le x xs [] [] r
-
- -- qpart partitions and sorts the sublists
- qpart le x [] rlt rge r =
- -- rlt and rge are in reverse order and must be sorted with an
- -- anti-stable sorting
- rqsort le rlt (x:rqsort le rge r)
- qpart le x (y:ys) rlt rge r =
- if le x y then
- qpart le x ys rlt (y:rge) r
- else
- qpart le x ys (y:rlt) rge r
-
- -- rqsort is as qsort but anti-stable, i.e. reverses equal elements
- rqsort le [] r = r
- rqsort le [x] r = x:r
- rqsort le (x:xs) r = rqpart le x xs [] [] r
-
- rqpart le x [] rle rgt r =
- qsort le rle (x:qsort le rgt r)
- rqpart le x (y:ys) rle rgt r =
- if le y x then
- rqpart le x ys (y:rle) rgt r
- else
- rqpart le x ys rle (y:rgt) r
-
-